#include "./../../../include/online/Reactor/TaskQueue.h"

TaskQueue::TaskQueue(size_t queSize)
    : _queSize(queSize)
    , _que()
    , _mutex()
    , _condFull()
    , _condEmpty()
{
}

// 将任务加入任务队列
// 任务队列为共享资源
void TaskQueue::push(ElementType&& task)
{
    // 上锁
    unique_lock<mutex> ul(_mutex);
    // 判断任务队列是否满
    while (full())
    {
        _condFull.wait(ul);
    }
    _que.push(std::move(task));
    // 此时，任务队列中至少有一个任务
    _condEmpty.notify_one();
}

// 从任务队列中拿任务
ElementType TaskQueue::pop()
{
    // 上锁
    unique_lock<mutex> ul(_mutex);
    // 判断任务队列是否空
    while (empty())
    {
        _condEmpty.wait(ul);
    }

    // 任务队列中有任务
    ElementType temp = _que.front();
    _que.pop();
    // 此时任务队列中至少有一个空位
    _condFull.notify_one();
    return temp;
}

bool TaskQueue::full()
{
    return _que.size() == _queSize;
}

bool TaskQueue::empty()
{
    return _que.size() == 0;
}

TaskQueue::~TaskQueue()
{
}
